package com.nifostasky.main.thread.create;

import java.io.ByteArrayOutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;

/**
 * 创建 : 通过Runnable创建线程;
 */
public class CreateRunnable {
    /**
     * - Java中只允许单继承，以卖票程序TiketSales类来说，很有可能这个类本来就有父类，
     * 这样一来就不可以继承Thread类来完成多线程了，
     * 但是一个类可以实现多个接口，因此实现的方式没有类的**单继承性的局限性，
     * **用实现Runnable接口的方式来完成多线程更加实用。
     *
     * - **实现Runnable接口的方式具有共享数据的特性**（不用static变量）。
     *
     *   * 继承Thread的实现方式，需要创建多个子类的对象来进行多线程，如果子类中有变量A，
     *   而不使用static约束变量的话，每个子类的对象都会有自己独立的变量A，
     *   只有static约束A后，子类的对象才共享变量A;
     *
     *   * 而实现Runnable接口的方式，只需要创建一个实现类的对象，
     *   要将这个对象传入Thread类并创建多个Thread类的对象来完成多线程，
     *   而这多个Thread类对象实际上就是调用一个实现类对象而已。
     *   实现的方式更适合来处理多个线程有共享数据的情况。
     * @param args
     * @throws InterruptedException
     */

    public static void main(String[] args) throws InterruptedException {

        System.out.println("===============================================================================");

        //创建执行体 Runnable
        MyRunnable myRunnable = new MyRunnable();
        //创建分配线程的Thread对象
        Thread thread1 = new Thread(myRunnable);
        Thread thread2 = new Thread(myRunnable);
        Thread thread3 = new Thread(myRunnable);

        //创建线程
        thread1.start();
        thread2.start();
        thread3.start();

        Thread.sleep(1000);
        System.out.println("===============================================================================");

    }

    private static String getDefaultCharSet() {
        OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream());
        String enc = writer.getEncoding();
        return enc;
    }

}

class MyRunnable implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            if (i % 2 == 0) System.out.println(Thread.currentThread().getName() + ":\t" + i);
        }
    }
}
